import axios from 'axios'
import { ElMessage } from 'element-plus'
import router from '../router'
import { API_BASE_URL } from '../config/index.js'

const service = axios.create({
  baseURL: API_BASE_URL+ '/', // API基础URL

  timeout: 50000
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    const token = localStorage.getItem('geeker-user')
    console.log(JSON.parse(token).token)
    // const token2='eyJhbGciOiJIUzUxMiJ9.eyJwY19sb2dpbl91c2VyX2tleSI6IjQ0NmFlNjk3NDllZDQ0MTU4OTczNzY1ODlmMDVmZjA3In0.t5lcfagqe4f5_YGOCoS7Fj2LtSTT3i660L-XNnQ44UEvuoswYrNcMP337npZ9XbzBDMIA5k3Yxgs5demuw18yA'
    config.headers['Authorization'] = `Bearer ${JSON.parse(token).token}` // 使用本地存储的token作为Authorization头部

    // 检查是否为FormData类型，如果是则不处理Content-Type和data
    if (!(config.data instanceof FormData)) {
      // 修改为标准大小写形式，并且仅当未设置时才添加默认值
      if (!config.headers['Content-Type']) {
        config.headers['Content-Type'] = 'application/json'
      }

      // 只处理非FormData类型的数据
      config.data = {
        ...config.data || {},
      }
    } else {
      // 对于FormData，删除Content-Type，让浏览器自动设置
      delete config.headers['Content-Type'];
    }
    
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    const res = response.data
    // 根据实际业务逻辑调整
    if (res.code === 401) {
      // 当状态码为401时，跳转到404页面
      ElMessage({
        message: '授权已过期，请重新登录',
        type: 'error',
        duration: 3000
      })
      // 使用路由跳转到404页面
      router.push('/404')
      return Promise.reject(new Error('授权已过期，请重新登录'))
    } else if (res.code !== 200) {
      // 显示错误消息
      ElMessage({
        message: res.msg || '请求失败',
        type: 'error',
        duration: 3000
      })
      return Promise.reject(new Error(res.msg || '请求失败'))
    } else {
      return res.data || res // 直接返回数据部分
    }
  },
  error => {
    // 处理错误响应
    if (error.response && error.response.status === 401) {
      // 当状态码为401时，跳转到404页面
      ElMessage({
        message: '授权已过期，请重新登录',
        type: 'error',
        duration: 3000
      })
      // 使用路由跳转到404页面
      router.push('/404')
    } else {
      ElMessage({
        message: error.message || '网络错误',
        type: 'error',
        duration: 3000
      })
    }
    return Promise.reject(error)
  }
)

// 导出通用请求方法
/**
 * GET请求
 * @param {string} url - 请求地址
 * @param {object} params - 请求参数
 * @param {object} config - 额外配置
 * @returns {Promise}
 */
export const get = (url, params = {}, config = {}) => {
  return service({
    url,
    method: 'get',
    params,
    ...config
  })
}

/**
 * POST请求
 * @param {string} url - 请求地址
 * @param {object} data - 请求体数据
 * @param {object} config - 额外配置
 * @returns {Promise}
 */
export const post = (url, data = {}, config = {}) => {
  // 设置默认 Content-Type，但允许被覆盖
  const defaultConfig = {
    headers: {
      'Content-Type': 'application/json'
    }
  };

  // 合并配置，使用传入的config覆盖默认值
  const mergedConfig = {
    ...defaultConfig,
    ...config,
    headers: {
      ...defaultConfig.headers,
      ...(config.headers || {})
    }
  };

  return service({
    url,
    method: 'post',
    data,
    ...mergedConfig
  })
}

/**
 * PUT请求
 * @param {string} url - 请求地址
 * @param {object} data - 请求体数据
 * @param {object} config - 额外配置
 * @returns {Promise}
 */
export const put = (url, data = {}, config = {}) => {
  return service({
    url,
    method: 'put',
    data,
    ...config
  })
}

/**
 * DELETE请求
 * @param {string} url - 请求地址
 * @param {object} params - 请求参数
 * @param {object} config - 额外配置
 * @returns {Promise}
 */
export const del = (url, params = {}, config = {}) => {
  return service({
    url,
    method: 'delete',
    params,
    ...config
  })
}

/**
 * 文件上传请求
 * @param {string} url - 上传地址
 * @param {File|FormData} file - 文件对象或FormData
 * @param {string} name - 文件字段名
 * @param {object} data - 额外的表单数据
 * @param {object} config - 额外配置
 * @returns {Promise}
 */
export const uploadFile = (url, file, name = 'file', data = {}, config = {}) => {
  let formData = new FormData();
  
  // 检查file是否存在
  if (!file) {
    console.error('File object is missing in uploadFile');
    return Promise.reject(new Error('文件对象缺失'));
  }
  
  // 如果传入的是options对象（el-upload的http-request参数），则提取文件
  if (file.file && file.file instanceof File) {
    file = file.file;
  }

  // 如果file已经是FormData实例则直接使用，否则创建新的FormData
  if (file instanceof FormData) {
    formData = file;
  } else {
    formData.append(name, file);

    // 添加其他表单数据
    Object.keys(data).forEach(key => {
      formData.append(key, data[key]);
    });
  }

  console.log('Uploading file:', file);
  console.log('FormData entries:');
  for (let pair of formData.entries()) {
    console.log(pair[0] + ': ' + pair[1]);
  }

  // 确保设置正确的content-type，但不指定boundary
  const uploadConfig = {
    ...config,
    headers: {
      ...(config.headers || {}),
    }
  };

  return service({
    url,
    method: 'post',
    data: formData,
    // 不设置Content-Type，让浏览器自动设置
    ...uploadConfig
  });
}

export default service
